package org.japo.java.entities;

public class Posicion {

    // Constantes
    public final static int ANCHO = 800;
    public final static int ALTO = 600;

    // Variables
    private int x;
    private int y;

    // Constructor predeterminado
    public Posicion() {
        this.x = 1;
        this.y = 1;
    }

    // Constructor parametrizado
    public Posicion(int x, int y) {
        if (validarPosicion(x, y)) {
            this.x = x;
            this.y = y;
        } else {
            this.x = 1;
            this.y = 1;
        }
    }

    // --- Inicio encapsulación
    //
    public int getX() {
        return x;
    }

    public void setX(int x) {
        if (validarPosicion(x, y)) {
            this.x = x;
        }
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        if (validarPosicion(x, y)) {
            this.y = y;
        }
    }

    // --- Fin encapsulación
    //
    // Informar coordenada de objeto visible
    public boolean validarPosicion() {
        return x >= 0 && x <= ANCHO &&
                y >= 0 && y <= ALTO;
    }

    // Informar coordenada visible
    public static boolean validarPosicion(int x, int y) {
        return x >= 0 && x <= ANCHO &&
                y >= 0 && y <= ALTO;
    }

    // Mostrar posición del objeto
    public void mostrarPosicion() {
        System.out.println("Posición: " + toString());
    }

    // --- Inicio de sobrecarga de métodos
    //
    @Override
    public String toString() {
        return String.format("[%d, %d]", x, y);
    }

    @Override
    public boolean equals(Object o) {
        // Semaforo de resultado
        boolean testOK;

        // Análisis del objeto
        if (o == null) {
            testOK = false;
        } else if (!(o instanceof Posicion)) {
            testOK = false;
        } else {
            Posicion p = (Posicion) o;
            testOK = x == p.x && y == p.y;
        }

        // Devolución del resultado
        return testOK;
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 89 * hash + this.x;
        hash = 89 * hash + this.y;
        return hash;
    }
}
